﻿#pragma once

#include <functional>

class HiUnSafeSmartHeapListImpl;

/*
 * @brief 自定义堆
 * @note 这是一个非线程安全的自定义堆，主要解决大对象申请中造成的堆碎片问题
 * @note 实现思路：
 *		1： 提前从堆中申请好足够数量的对象
 *		2： 如果超过一定的使用量会发出警告，恢复水位后会发出通知
 * @note 假设：
 *		1： 申请者申请的为大对象（>1024bit）
 *		2： 申请数量为1000以内
 *		3： 用户在单线程中使用本类,或者1路写，1路读
 *		3： 假设创建对象（ALLOC_FUN）都能成功，不返回空值
 */
class HiUnSafeSmartHeapList {
  public:
    using ALLOC_FUN = std::function<void *()>;
    using RELEASE_FUN = std::function<void(void *)>;
    using ON_WARNNING = std::function<void(bool)>;

  public:
    ~HiUnSafeSmartHeapList();

  public:
    bool Init(int count, const ALLOC_FUN &allocFun,
              const RELEASE_FUN &releaseFun);
    void Destory();

  public:
    template <typename T> T *Create() {
        void *ptr = CreateData();
        if (nullptr == ptr) {
            return nullptr;
        }
        return (T *)CreateData();
    }
    void *CreateData();
    void Release(void *t);
    int UsingCount();

  private:
    HiUnSafeSmartHeapListImpl *impl{nullptr};
};
